﻿using System;
using System.Collections.Generic;
//4.11.8 动态表达式
//域、属性、方法、事件、构造函数、索引器、运算符和转换都是可以实现动态调用的。
//不允许尝试获取返回类型为void的动态表达式的结果的操作，这与具有静态类型的表达式相似。两者的区别在于错误发生在运行时：

namespace _134_动态绑定_动态表达式
{
    class Program
    {
        static void Main(string[] args)
        {
            dynamic list = new List<int>();
            var result = list.Add(5); // 抛出RuntimeBinderException。
            
            //包含动态操作数的表达式一般情况下本身就是动态的，因为缺少类型信息的结果是向下传递：
            dynamic x = 2;
            var y = x * 3; // y的静态类型是动态的
            
            //这个规则有一些例外情况。首先，将一个动态表达式转换为静态类型会产生一个静态表达式：
            /*
            dynamic x = 2;
            var y = (int)2; // y的静态类型是int
            */
            
            //其次，构造函数调用总是产生静态的表达式，即使调用时使用的是动态参数。在这个例子中，x被设置为静态类型StringBuilder：
            /*
            dynamic capacity = 10;
            var x = new System.Text.StringBuilder(capacity);
            */
            //此外，在少数情况下，包含动态参数的表达式也是静态的，包括传递索引到数组和委托创建表达式。
        }
    }
}
